package com.oig.iframe.gateway.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;


/**
 * 先加全局校验过滤器
 * 三种校验方式：
 * 1、不适用spring cloud oauth2， 登录 token放redis，然后网关拦截，检查token以及url权限，业务服务无状态，无权限校验，安全性需要物理隔离配合
 * 2、使用spring cloud oauth2， 网关不做权限处理， 业务服务增加spring cloud oauth2配置（引入sys-common-security开启即可），作为资源服务
 *    需要权限校验的接口方法上加权限注解， 调用sys-auth-security（认证授权服务）的/oauth/check_token时会校验权限
 * 3、使用spring cloud oauth2，网关统一处理， 网关配置成资源服务，业务服务无状态，无权限校验，需要物理隔离配合
 */
@Component
@Slf4j
public class AccessGatewayFilter implements GlobalFilter, Ordered {

    /**
     * 改为采用第二种方式
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.debug("--------gateway filter-----");
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getURI().getRawPath();
        String referer = request.getHeaders().getFirst("referer");
        log.debug("uri:{},referer={}, method={}",  path, referer, request.getMethod());

        return chain.filter(exchange.mutate().request(request).build());
    }

    @Override
    public int getOrder() {
        return -1000;
    }
}
